1. Summary
1.1 Summary table
A total of 255,427 persons have been reached by EiE activities in
2023, of which 127,370 were boys, 121,766 were girls, 43,725 were men
and 13,160 were women. Below is a summary by indicator.
There has been a correction to indicator 1, as the previous
calculation took into account adults, when only children reached count
towards this indicator.
Summary statistics for EIE 5Ws reporting, 25 June 2023Indicator | Partners1 | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
1. Access ECD spaces/schools | 11 | 14 | 6,706 | 137,812 | 1,201,151 | 11.47 |
2. Feeding programmes | 9 | 6 | 1,456 | 48,249 | 784,647 | 6.15 |
3. Teaching materials | 9 | 10 | 0 | 146,339 | 600,578 | 24.37 |
4. Safe water, personal hygiene | 6 | 5 | 0 | 27,228 | 784,647 | 3.47 |
5. Educators resilience enhancing | 14 | 12 | 729 | 4,859 | 6,018 | 80.74 |
6. Children resilience enhancing | 11 | 12 | 2,592 | 64,507 | 154,729 | 41.69 |
Total | 33 | 18 | 11,483 | 255,4272 | 2,146,5452 | 11.90 |
1Only implementing partners |
2Only the sum of indicators 1, 2, 5 and 6 |
1.2 By sex and age

Only Indicator 6, Children benefiting from resilience-enhancing
programming, sees a higher proportion of females reached over men.

1.3 By county
39.8% of all beneficiaries reached originate from Turkana, though it
only has 14.05% of the targeted population.

IPC data extracted from here.
2. Progress by indicator
2.1 Overall progress

2.2 Reached by indicator
2.2.1 Access to ECD spaces/schools
EiE Indicator 1, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
1. Access ECD spaces/schools | 11 | 14 | 6,706 | 137,812 | 1,201,151 | 11.47 |

In June 2023, 6,706 persons were reached by interventions
contributing to this indicator, of which 3,486 were boys and 3,220 were
girls.

2.2.2 School feeding programmes
EiE Indicator 2, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
2. Feeding programmes | 9 | 6 | 1,456 | 48,249 | 784,647 | 6.15 |

In June 2023, 1,456 persons were reached by interventions
contributing to this indicator, of which 783 were boys and 673 were
girls.

2.2.3 Teaching and learning materials
EiE Indicator 3, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
3. Teaching materials | 9 | 10 | 0 | 146,339 | 600,578 | 24.37 |

In June 2023, 0 persons were reached by interventions contributing to
this indicator, of which 0 were boys, 0 were girls, 0 were men and 0
were women.

2.2.4 Safe water, personal hygiene
EiE Indicator 4, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
4. Safe water, personal hygiene | 6 | 5 | 0 | 27,228 | 784,647 | 3.47 |

In June 2023, 0 persons were reached by interventions contributing to
this indicator, of which 0 were boys and 0 and were girls.

2.2.5 Educators trained in resilience enhancing programmes
EiE Indicator 5, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
5. Educators resilience enhancing | 14 | 12 | 729 | 4,859 | 6,018 | 80.74 |

In June 2023, 729 persons were reached by interventions contributing
to this indicator, of which 474 were men and 255 and were women.

2.2.6 Children benefited from resilience enhancing programmes
EiE Indicator 6, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
6. Children resilience enhancing | 11 | 12 | 2,592 | 64,507 | 154,729 | 41.69 |

In June 2023, 2,592 persons were reached by interventions
contributing to this indicator, of which 1,330 were boys and 1,262 and
were girls

3. Partners
3.1 Operational presence of implementing partners
Below is an interactive table which adds detail to the map above,
serving additional information for coordination – allowing interested
parties to search by county or partner.
The column #Activities refers to the number of Education
activities implemented by said partner in each county. Each column can
be sorted with the arrows next to each column name. Each column can also
be filtered by typing into the search bar below each column name. Only
completed activities have been included.
Download the dataset from the table below here.
3.2 Summary by implementing partner
The table below breaks down persons reached by partner.
Summary by implementing partnerimplementing_partner | reached1 | counties | activities | %total2 |
|---|
Finn Church Aid | 187,251 | 5 | 6 | 43.65 |
Norwegian Refugee Council | 52,914 | 2 | 3 | 12.33 |
World Vision Kenya | 32,353 | 6 | 6 | 7.54 |
Women Educational Researchers of Kenya | 23,122 | 5 | 2 | 5.39 |
We World | 20,947 | 2 | 1 | 4.88 |
Lifeskills Promoters | 19,199 | 2 | 3 | 4.48 |
Save the Children | 19,002 | 4 | 3 | 4.43 |
Food for the Hungry | 17,974 | 2 | 4 | 4.19 |
Jesuit Refugee Service | 14,854 | 1 | 1 | 3.46 |
AVSI Foundation | 9,768 | 2 | 3 | 2.28 |
Ministry of Education | 8,241 | 1 | 2 | 1.92 |
Homa Bay County | 7,020 | 1 | 1 | 1.64 |
Action for Sustainable Change | 4,160 | 1 | 3 | 0.97 |
Nawiri Children Development Program | 3,487 | 1 | 2 | 0.81 |
Mondi | 2,197 | 1 | 1 | 0.51 |
Qatar Charity | 1,541 | 1 | 1 | 0.36 |
The Girl Child Network | 1,050 | 2 | 1 | 0.24 |
Bartabwa | 849 | 1 | 1 | 0.20 |
County Director of Education Mandera | 600 | 1 | 1 | 0.14 |
Frontiers Community Development Program | 491 | 1 | 1 | 0.11 |
Special Olympics Kenya | 436 | 3 | 1 | 0.10 |
County Director of Education Wajir | 361 | 1 | 1 | 0.08 |
ERIKs Development Partner | 249 | 1 | 1 | 0.06 |
Servants of the Poor | 202 | 1 | 1 | 0.05 |
Windle International Kenya | 196 | 1 | 1 | 0.05 |
Dignitas | 135 | 1 | 1 | 0.03 |
SMB | 135 | 1 | 1 | 0.03 |
Missionary Sisters of the Catechism | 85 | 1 | 1 | 0.02 |
MOE/TSC | 60 | 1 | 1 | 0.01 |
Voluntary Service Overseas | 42 | 1 | 1 | 0.01 |
Futebol da Forcaa | 40 | 1 | 1 | 0.01 |
Evangelizing Sisters of Mary | 23 | 1 | 1 | 0.01 |
IWS | 10 | 1 | 2 | 0.00 |
1All indicators as opposed only indicators 1, 2, 5 and 6 |
2Percentage of reached for all indicators |
4. Schools and education level
4.1 Schools
The number of schools reached by school feeding programmes and WASH
in schools interventions to-date are:

However, reporting the overall number of schools reached by all EiE
interventions is much more challenging.
Whilst all partners working on indicators 2 and 4 submitted the
number of schools they were working in, the same is not true for the
other indicators. Only indicators 2 and 4 require the reporting of the
number of schools.
4.2 Education level
The data collected on education level is muddled: the combination of
various categories (such as ECE & Primary and
All Basic Education) hampers a clean breakdown by education
level:
Children reached by education leveleducation_level | children | %_of_total |
|---|
Primary | 247,601 | 55.04 |
ECE & Primary | 134,071 | 29.80 |
All Basic Education | 26,104 | 5.80 |
ECE | 24,084 | 5.35 |
Secondary | 17,976 | 4.00 |
Vocational | 23 | 0.01 |
Tertiary | 20 | 0.00 |
For instance, it is not possible to calculate the number of children
served from primary-level institutions.
To understand reporting around the mismatch of education-level
categories, let us examine individual indicators. In the plot below,
children reached have been broken down by education level and by
indicator. The category All Basic Education, whilst present
in all of the indicators, is most heavily used in the WASH-in-schools
intervention. Additionally, this indicator is used by 5 different
implementing partners.

5. Reference maps and tables
5.1 Reference maps
IPC data extracted from here.

5.2 Reference table
Download the EiE 5Ws data here
As a refresher for the reference table below, the indicators are:
indicator |
|---|
indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas |
indicator 2 # of schools/ECD spaces with feeding programmes |
indicator 3 # of learners and teachers reached with learning and teaching materials |
indicator 4 # of schools with adequate quantites of safe water for drinking and personal hygiene |
indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
5.3 Reporting quality
5.3.1 Sub-counties
For several entries, there is more than one sub-county per rowCounty | Sub_county | Total_reached |
|---|
Baringo | Marigat, Tiaty West | 351 |
Garissa | Dadaab | 356 |
Garissa | Dadaab | 1,558 |
Wajir | Habasweine, Bute, Eldas, Sabuli, Buna, Korondile | 190 |
Tana River | Tana River, Tana North, Bangal | 557 |
Tana River | Tana River, Tana North, Bangal | 3,769 |
With reference to the extract from the 5Ws above, analysis and
reporting is at the sub-county level for the 86% of beneficiaries who
were reported without this type of error. However, until this issue is
resolved, making any sub-county-level maps or products will necessarily
exclude a sizeable portion of the beneficiaries reached.
86% of beneficiaries reported with one sub-county per rowOne_sub_county | Total_reached | %_Total |
|---|
TRUE | 410,171 | 85.53 |
FALSE | 62,673 | 13.07 |
NA | 6,744 | 1.41 |
In the proposed revision to the 5W template, the sub-county column
has been revised to be a dropdown list dependent on the input in the
county column. Going forward, only one sub-county should be
reported per row.
5.3.2 Schools
The next step is to move from entering the names of schools to just
entering the number of schools per intervention. The
schools_text column below is data entered into 5Ws
template. The column is currently a mix of names of schools and number
of schools. It is best to collect only the number of schools and have
the names be included in the comments.
Schools column is a mix of text and numbersSchools_text | Schools_number |
|---|
Eldas pry, Dela pry, Elnur pry, Habasweine pry and Tosorie pry | 5 |
23 | 23 |
Lailangi, Laaria, Mumui, Rei and Victor Besone Pri Sch | 5 |
It is still valuable to collect school names and match them to the
list of school codes and geocoordinates, especially for site-level
monitoring, but that is a step to be taken once the format of school
names being collected has been standardised.
5.3.3 Education level
As reported in an earlier section of the document, it is currently
not possible to have a clean breakdown of beneficiaries reached by
education level:
Children reached by education leveleducation_level | children | %_of_total |
|---|
Primary | 247,601 | 55.04 |
ECE & Primary | 134,071 | 29.80 |
All Basic Education | 26,104 | 5.80 |
ECE | 24,084 | 5.35 |
Secondary | 17,976 | 4.00 |
Vocational | 23 | 0.01 |
Tertiary | 20 | 0.00 |
In the updated template, the options All Basic Education
and Primary/ECE have been removed and partners are
requested to only select one education level per row.
LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgSW5zdGFsbGF0aW9uIG9mIG1kZXByaXYgcGFja2FnZQ0KIyBpbnN0YWxsIHBhY2thZ2UgZGV2dG9vbHMgaWYgbm90IHlldCBpbnN0YWxsZWQNCiMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpDQoNCiMgaW5zdGFsbCBmYXN0IGZyb20gR2l0SHViIHdpdGhvdXQgdmlnbmV0dGVzIA0KIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYS1iZW5pbmkvbWRlcHJpdiIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFDQoNCiMgQWx0ZXJuYXRpdmVseSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTogaHR0cHM6Ly9hLWJlbmluaS5naXRodWIuaW8vbWRlcHJpdi8NCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiMgbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIEZpeGluZyBkYXRlcw0KbmFtZV90b19kYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbHVicmlkYXRlOjptZHkoaWZlbHNlKHggJWluJSBjKG1vbnRoLm5hbWUsIG1vbnRoLmFiYiksIHBhc3RlMCh4LCAiLzAxLzIwMjMiKSwgeCkpDQp9DQpgYGANCg0KDQoNCg0KYGBge3IgZGF0YX0NCmxvY2F0aW9ucyA8LSByZWFkX3hsc3goIi4vZGF0YS9rZW5fYWRtaW5ib3VuZGFyaWVzX3RhYnVsYXJkYXRhLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICJBRE0yIikgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCg0KcmVwb3J0X2RhdGUgPC0gIjI1IEp1bmUgMjAyMyINCg0KcmVwb3J0X21vbnRoIDwtICJKdW5lIg0KDQpzaXRyZXBfdGFibGUgPC0gcmVhZF94bHN4KCIuL2RhdGEvc2l0cmVwX3Jlc3VsdHNfdGFibGUueGxzeCIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQp0YXJnZXRzIDwtIHJlYWRfY3N2KCIuL2RhdGEvZWllX3RhcmdldHMuY3N2IikNCg0KcGNvZGUxX3NoYXBlIDwtIA0KICBzZjo6c3RfcmVhZCgiLi9kYXRhL2tlbl9hZG1faWViY18yMDE5MTAzMV9zaHAva2VuX2FkbWJuZGFfYWRtMV9pZWJjXzIwMTkxMDMxLnNocCIsIA0KICAgICAgICAgIHF1aWV0ID0gVFJVRSkgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmlwYyA8LSByZWFkX2NzdigiLi9kYXRhL2lwYy5jc3YiKQ0KDQpwYXJ0bmVyX2xpc3RfY291bnRpZXMgPC0gcmVhZF9jc3YoIi4vZGF0YS9wYXJ0bmVyX2xpc3RfY291bnRpZXMuY3N2IikgJT4lIA0KICBmaWx0ZXIocGFydG5lcl90eXBlID09ICJpbXBsZW1lbnRpbmdfcGFydG5lciIpDQoNCmVpZSA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV81d3MuY3N2IikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJveXMgPSAwLCBnaXJscyA9IDAsIG1lbiA9IDAsIHdvbWVuID0gMCkpICU+JSANCiAgIyBUb3RhbCByZWFjaGVkIG9mIGluZGljYXRvciAxIGlzIG9ubHkgYm95cyBhbmQgZ2lybHMgDQogIG11dGF0ZSh0b3RhbF9yZWFjaGVkID0gaWZlbHNlKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiMSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm95cyArIGdpcmxzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfcmVhY2hlZCkpDQpgYGANCg0KDQoNCjxicj48YnI+PGJyPg0KDQojIDEuIFN1bW1hcnkNCg0KIyMgMS4xIFN1bW1hcnkgdGFibGUNCg0KYGBge3J9DQpzdW1fc3RhdHMgPC0gZWllICU+JSAgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChjb3VudHkpLCANCiAgICAgICAgICAgIHJlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgbWVuID0gc3VtKG1lbltzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgd29tZW4gPSBzdW0od29tZW5bc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGJveXMgPSBzdW0oYm95c1tzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGdpcmxzID0gc3VtKGdpcmxzW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgcmVhY2hlZF8xMjU2ID0gc3VtKHRvdGFsX3JlYWNoZWRbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIiYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggJWluJSByZXBvcnRfbW9udGhdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQoNCmBgYA0KDQpBIHRvdGFsIG9mIGByIHN1bV9zdGF0cyAlPiUgcHVsbChyZWFjaGVkXzEyNTYpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIGhhdmUgYmVlbiByZWFjaGVkIGJ5IEVpRSBhY3Rpdml0aWVzIGluIDIwMjMsIG9mIHdoaWNoIGByIHN1bV9zdGF0cyAlPiUgcHVsbChib3lzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzLCBgciBzdW1fc3RhdHMgJT4lIHB1bGwoZ2lybHMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLCBgciBzdW1fc3RhdHMgJT4lIHB1bGwobWVuKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIHN1bV9zdGF0cyAlPiUgcHVsbCh3b21lbikgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgd29tZW4uIEJlbG93IGlzIGEgc3VtbWFyeSBieSBpbmRpY2F0b3IuIA0KDQpUaGVyZSBoYXMgYmVlbiBhIGNvcnJlY3Rpb24gdG8gaW5kaWNhdG9yIDEsIGFzIHRoZSBwcmV2aW91cyBjYWxjdWxhdGlvbiB0b29rIGludG8gYWNjb3VudCBhZHVsdHMsIHdoZW4gb25seSBjaGlsZHJlbiByZWFjaGVkIGNvdW50IHRvd2FyZHMgdGhpcyBpbmRpY2F0b3IuIA0KDQo8YnI+DQoNCg0KYGBge3J9DQoNCg0Kc3VtbWFyeV90YWJsZSA8LSBlaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShsYXRlc3RfcmVhY2hlZCA9IGlmZWxzZShtb250aCAlaW4lIHJlcG9ydF9tb250aCwgdG90YWxfcmVhY2hlZCwgTkFfaW50ZWdlcl8pKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoYWRtMV9wY29kZSksICAgDQogICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IHN1bShsYXRlc3RfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB0b3RhbF9yZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCwsLCBsYXRlc3RfcmVhY2hlZCwgdG90YWxfcmVhY2hlZCkgJT4lIA0KICBtdXRhdGUocGFydG5lcnMgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIHN1bV9zdGF0cyRwYXJ0bmVycywgcGFydG5lcnMpLCANCiAgICAgICAgIGNvdW50aWVzID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCBzdW1fc3RhdHMkY291bnRpZXMsIGNvdW50aWVzKSwgDQogICAgICAgICB0b3RhbF9yZWFjaGVkID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3N0YXRzJHJlYWNoZWRfMTI1NiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQpLCANCiAgICAgICAgIGxhdGVzdF9yZWFjaGVkID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9zdGF0cyRsYXRlc3RfcmVhY2hlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgPT0gInBlb3BsZSIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UodGFyZ2V0ID0gc3VtKGNvdW50eV90YXJnZXQpKSwgDQogICAgICAgICAgICBieSA9ICJpbmRpY2F0b3Jfc2hvcnQiKSAlPiUgDQogIG11dGF0ZSh0YXJnZXQgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMgJT4lIGRpc3RpbmN0KGNvdW50eSwgY291bnR5X292ZXJhbGxfdGFyZ2V0KSAlPiUge3N1bSguJGNvdW50eV9vdmVyYWxsX3RhcmdldCl9LCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKHRvdGFsX3JlYWNoZWQgLyB0YXJnZXQgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAgc2VsZWN0KGluZGljYXRvciA9IGluZGljYXRvcl9zaG9ydCwgcGFydG5lcnMsIGNvdW50aWVzLCANCiAgICAgICAgIGxhdGVzdF9yZWFjaGVkLCB0b3RhbF9yZWFjaGVkLCB0YXJnZXQsIGAldGFyZ2V0X3JlYWNoZWRgID0gcGMpICU+JQ0KICBzZWxlY3RfYWxsKH4gZ3N1YigibGF0ZXN0IiwgDQogICAgICAgICAgICAgICAgICAgIHJlcG9ydF9tb250aCwgLikpICU+JQ0KICBzZWxlY3RfYWxsKH4gc3RyX3RvX3RpdGxlKC4pKSAgDQoNCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIlN1bW1hcnkgc3RhdGlzdGljcyBmb3IgRUlFIDVXcyByZXBvcnRpbmcsICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxOjYsIGogPSAxLCBzaXplID0gOSkgJT4lIA0KICBmb250c2l6ZShzaXplID0gOSwgcGFydCA9ICJoZWFkZXIiKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gMiwgcGFydCA9ICJoZWFkZXIiLCByZWZfc3ltYm9scyA9ICIxIiwgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiT25seSBpbXBsZW1lbnRpbmcgcGFydG5lcnMiKSkgJT4lIA0KICBmb290bm90ZShpID0gNywgaiA9IDU6NiwgcmVmX3N5bWJvbHMgPSAiMiIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIk9ubHkgdGhlIHN1bSBvZiBpbmRpY2F0b3JzIDEsIDIsIDUgYW5kIDYiKSkNCg0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4yIEJ5IHNleCBhbmQgYWdlDQoNCg0KYGBge3J9DQplaWUgJT4lIA0KICBtdXRhdGUoaW5kaWNhdG9yX3Nob3J0ID0gZmN0X3JldihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiBzdW0oLiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodG90YWxfcmVhY2hlZCA9IGJveXMgKyBnaXJscyArIG1lbiArIHdvbWVuLCANCiAgICAgICAgIGZlbWFsZSA9ICh3b21lbiArIGdpcmxzKSAvIHRvdGFsX3JlYWNoZWQsIA0KICAgICAgICAgbWFsZSA9IChib3lzICsgbWVuKSAvIHRvdGFsX3JlYWNoZWQpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoZmVtYWxlLCBtYWxlKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZXgiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwYyIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIGZpbGwgPSBzZXgpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IHBjLCANCiAgICAgICAgICAgICAgICB5ID0gaW5kaWNhdG9yX3Nob3J0LCANCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSwgDQogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM0NDM5ODMiLCAiIzM1Yjc3OSIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJTZXggYnJlYWtkb3duIGJ5IGluZGljYXRvciIpICANCg0KYGBgDQoNCjxicj4NCg0KT25seSBJbmRpY2F0b3IgNiwgQ2hpbGRyZW4gYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UtZW5oYW5jaW5nIHByb2dyYW1taW5nLCBzZWVzIGEgaGlnaGVyIHByb3BvcnRpb24gb2YgZmVtYWxlcyByZWFjaGVkIG92ZXIgbWVuLiANCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplaWUgJT4lIA0KICBtdXRhdGVfYXQodmFycyhib3lzLCBnaXJscywgbWVuLCB3b21lbiksIH4gcmVwbGFjZV9uYSguLCAwKSkgJT4lDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhtZW4sIHdvbWVuLCBib3lzLCBnaXJscyksIH4gc3VtKC4pKSAlPiUgDQogIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMobWVuLCB3b21lbiwgYm95cywgZ2lybHMpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyZWFjaGVkIikgJT4lIA0KICBtdXRhdGUodHlwZSA9IHN0cl90b190aXRsZSh0eXBlKSwgDQogICAgICAgICB0eXBlID0gZmN0X3JlbGV2ZWwodHlwZSwgYygiTWVuIiwgIldvbWVuIiwgIkJveXMiLCAiR2lybHMiKSkpICU+JSANCiAgIyBZb3UncmUganVzdCBmaWx0ZXJpbmcgdGhlbSBvdXQgbWFudWFsbHkNCiAgbXV0YXRlKHJlYWNoZWQgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiB0eXBlID09ICJCb3lzIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgdHlwZSA9PSAiR2lybHMiIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiB0eXBlID09ICJNZW4iIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiB0eXBlID09ICJXb21lbiIgfiAwLCANCiAgICBUUlVFIH4gcmVhY2hlZA0KICApKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IHR5cGUsIHggPSByZWFjaGVkLCBmaWxsID0gdHlwZSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHJlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxIC8gMTAwMCwgc3VmZml4ID0gIksiKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4yLCBlbmQgPSAuOSkgKyANCiAgZmFjZXRfd3JhcCh+IGluZGljYXRvcl9zaG9ydCwgc2NhbGVzID0gImZyZWVfeCIpICsgDQogIGxhYnMoeCA9ICJQZXJzb25zIHJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlJlYWNoIGRpc2FnZ3JlZ2F0ZWQgYnkgc2V4LCBhZ2UgYW5kIGluZGljYXRvciIpDQoNCg0KYGBgDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyAxLjMgQnkgY291bnR5DQoNCmBgYHtyfQ0KY3VtX3BjPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKHBjX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjX3RhcmdldCA9IHJvdW5kKHRhcmdldCAvIHN1bSh0YXJnZXQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGN1bV9wYyA9IGN1bXN1bShwY19iZW4pKQ0KYGBgDQoNCmByIGN1bV9wYyAlPiUgZmlsdGVyKGNvdW50eSA9PSAiVHVya2FuYSIpICU+JSBwdWxsKGN1bV9wYylgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkIG9yaWdpbmF0ZSBmcm9tIFR1cmthbmEsIHRob3VnaCBpdCBvbmx5IGhhcyBgciBjdW1fcGMgJT4lIGZpbHRlcihjb3VudHkgPT0gIlR1cmthbmEiKSAlPiUgcHVsbChwY190YXJnZXQpYCUgb2YgdGhlIHRhcmdldGVkIHBvcHVsYXRpb24uIA0KDQo8YnI+DQoNCmBgYHtyfQ0KDQplaWUgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlLCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lICANCiAgbXV0YXRlKGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgc2VjdG9yX3JlYWNoZWQpKSAlPiUgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIGxlZnRfam9pbihpcGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtMV9wY29kZSwgcGVyY2VudF9waGFzZV9wMyksIA0KICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHNlY3Rvcl9yZWFjaGVkLCB0YXJnZXQpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBpZmVsc2UodHlwZSA9PSAidGFyZ2V0IiwgIkNvdW50eSBUYXJnZXQiLCAiU2VjdG9yIFJlYWNoZWQiKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodmFsdWUgPSAwKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHZhbHVlLCANCiAgICAgICAgICAgICB5ID0gY291bnR5LCANCiAgICAgICAgICAgICBmaWxsID0gcGVyY2VudF9waGFzZV9wMykpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHZhbHVlKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxLzEwMDAsIHN1ZmZpeCA9ICJLIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50KSArIA0KICBmYWNldF9ncmlkKH4gdHlwZSwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArIA0KICBsYWJzKGZpbGwgPSAiJSBJUEMzKyIsDQogICAgICAgeCA9ICJUYXJnZXQvcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgY2FwdGlvbiA9ICJDb2xvdXJzIHJlZmVyIHRvICUgb2YgY291bnR5IHBvcHVsYXRpb24gaW4gSVBDIHBoYXNlIDMgb3IgYWJvdmUuIEhvbWEgQmF5IHdhcyBub3QgYXNzZXNzZWQgYXMgcGFydCBvZiB0aGUgSVBDIENsYXNzaWZpY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIHRhcmdldHMgYW5kIHJlYWNoZWQiKSArDQogIHRoZW1lKCMgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwgDQogICAgICAgICMgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLCANCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQpgYGANCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjIxMC8/aXNvMz1LRU4pLg0KDQo8YnI+PGJyPjxicj4NCg0KDQoNCiMgMi4gUHJvZ3Jlc3MgYnkgaW5kaWNhdG9yDQoNCiMjIDIuMSBPdmVyYWxsIHByb2dyZXNzDQoNCg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQoNCmxpbmVfdmFsdWVzIDwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG5hbWVfdG9fZGF0ZShtb250aCkpICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSwgaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGluZGljYXRvcl9zaG9ydCkgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGluZGljYXRvcl9zaG9ydCkpICsgDQogIGdlb21fc3RlcChzaXplID0gMSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIHggPSAtSW5mLCB5ID0gSW5mLCBoanVzdCA9IC0wLjE1LCB2anVzdCA9IDAuOSwgZGF0YSA9IGxpbmVfdmFsdWVzKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBmYWNldF93cmFwKH5pbmRpY2F0b3Jfc2hvcnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBpbnRlcnZlbnRpb25zIiwgDQogICAgICAgdGl0bGUgPSBwYXN0ZTAoIk1vbnRobHkgcHJvZ3Jlc3MgYnkgYWN0aXZpdHksICIsIHJlcG9ydF9kYXRlKSwNCiAgICAgICBzdWJ0aXRsZSA9ICJJbmRpY2F0b3Igc3VidG90YWwgaW4gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoIGZhY2V0IikgDQogIA0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyAyLjIgUmVhY2hlZCBieSBpbmRpY2F0b3INCg0KYGBge3J9DQpiZW5fcGxvdCA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSANCiAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSAgDQogICAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGNvdW50eSkpICsgDQogICAgZ2VvbV9jb2woYWVzKGZpbGwgPSBwYykpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcyksIGhqdXN0ID0gImlud2FyZCIpLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIpICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50LCBiZWdpbiA9IC4yKSArIA0KICAgIGxhYnModGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIiwgDQogICAgICAgICB4ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICAgIHkgPSAiIiwgDQogICAgICAgICBmaWxsID0gIiUgcmVhY2hlZCIpIA0KfQ0KDQpwY19wbG90IDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgJWluJSBjKCJwZW9wbGUiKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjb3VudHksIGluZGljYXRvcl9zaG9ydCwgY291bnR5X3RhcmdldCksIA0KICAgICAgICAgICAgICBieSA9IGMoImNvdW50eSIsICJpbmRpY2F0b3Jfc2hvcnQiKSkgJT4lIA0KICAgIHJlcGxhY2VfbmEobGlzdChjb3VudHlfdGFyZ2V0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICAgIG11dGF0ZShwYyA9IGlmZWxzZShjb3VudHlfdGFyZ2V0ID4gMCwgYmVuZWZpY2lhcmllcyAvIGNvdW50eV90YXJnZXQsIDApLCANCiAgICAgICAgICAgY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGNvdW50eSkpICsgDQogICAgZ2VvbV9jb2woYWVzKGZpbGwgPSBwYykpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gLjEpLCBoanVzdCA9ICJpbndhcmQiKSwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiKSArIA0KICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50LCBiZWdpbiA9IC4yKSArIA0KICAgIGxhYnModGl0bGUgPSAiJSBvZiB0YXJnZXQgcmVhY2hlZCIsIA0KICAgICAgICAgeCA9ICIlIHJlYWNoZWQiLCANCiAgICAgICAgIHkgPSAiIiwgDQogICAgICAgICBmaWxsID0gIiUgcmVhY2hlZCIpICsNCiAgICANCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQp9DQpgYGANCg0KYGBge3J9DQp0YXJnZXRzX3JhbmdlIDwtIHRhcmdldHMgJT4lIA0KICBmaWx0ZXIodGFyZ2V0X3VuaXQgPT0gInBlb3BsZSIpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHRhcmdldCA9IHN1bShjb3VudHlfdGFyZ2V0LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbmRpY2F0b3Jfc2hvcnQsIHZhbHVlc19mcm9tID0gdGFyZ2V0KSAlPiUgDQogIHNldE5hbWVzKGMoImNvdW50eSIsICJpbmRpY2F0b3IxIiwgImluZGljYXRvcjIiLCAiaW5kaWNhdG9yMyIsICJpbmRpY2F0b3I0IiwgDQogICAgICAgICAgICAgImluZGljYXRvcjUiLCAiaW5kaWNhdG9yNiIpKQ0KDQppbmRpY2F0b3JfbWFwIDwtIGZ1bmN0aW9uKHRibCwgaW5kaWNhdG9yX251bWJlciwgcGxvdF9vcHRpb24pIHsNCiAgDQogIHBsb3Rfb3B0aW9uIDwtIGVucXVvKHBsb3Rfb3B0aW9uKQ0KICBpbmRpY2F0b3JfbnVtYmVyIDwtIGVucXVvKGluZGljYXRvcl9udW1iZXIpDQogIA0KICB0YmwgJT4lIA0KICAgIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgISFpbmRpY2F0b3JfbnVtYmVyKSkgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICEhaW5kaWNhdG9yX251bWJlcikpICU+JQ0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwIHwgY291bnR5X3RhcmdldCA+IDApICAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgbmFuaWFyOjpyZXBsYWNlX3dpdGhfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBsZWZ0X2pvaW4obG9jYXRpb25zICU+JSANCiAgICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHkgPSBhZG0xX2VuLCBhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSANCiAgICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgYnkgPSBjKCJhZG0xX3Bjb2RlIikpICU+JQ0KICAgIHN0X2FzX3NmKCkgJT4lIA0KICAgIGdncGxvdCgpICsgDQogICAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgICBhZXMoZmlsbCA9ICEhcGxvdF9vcHRpb24pKSArIA0KICAgIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYSghIXBsb3Rfb3B0aW9uKSksDQogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLA0KICAgICAgICAgICAgICAgICBzaXplID0gMi41KSArIA0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICAgIHRoZW1lX3ZvaWQoKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQogICAgDQp9DQoNCmBgYA0KDQojIyMgMi4yLjEgQWNjZXNzIHRvIEVDRCBzcGFjZXMvc2Nob29scw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjEiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAxLCBhcyBvZiAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkNCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjEiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjEiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IxKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIxLiBBY2Nlc3MgdG8gRUNEIHNwYWNlcy9zY2hvb2xzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCByZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KDQoNCjxicj4NCg0KSW4gYHIgcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIxLiBDaGlsZHJlbiBhY2Nlc3NpbmcgRUNEIHNwYWNlcy9zY2hvb2xzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjIgU2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjIiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAyLCBhcyBvZiAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiMiIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiMiIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjIpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjIuIFNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjIuIEZlZWRpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjMgVGVhY2hpbmcgYW5kIGxlYXJuaW5nIG1hdGVyaWFscw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjMiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAzLCBhcyBvZiAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiMyIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiMyIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjMpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjMuIFRlYWNoaW5nIGFuZCBsZWFybmluZyBtYXRlcmlhbHMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMsICBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRtZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR3b21lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgd29tZW4uIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMy4gVGVhY2hpbmcgbWF0ZXJpYWxzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCB0YXJnZXRzIGhhdmUgMCUgcmVhY2hlZCIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjQgU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZQ0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjQiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA0LCBhcyBvZiAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNCIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNCIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjQpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjQuIFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscy4gDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjQuIFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi41IEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI1IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNSwgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjUiLCBjb3VudHlfdGFyZ2V0KSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG5hLnZhbHVlID0gImdyZXk4MCIsIGxpbWl0cyA9IHJhbmdlKGMoMCwgMTgxMykpKSArIA0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI1IiwgYmVuZWZpY2lhcmllcykgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNS4gRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRtZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR3b21lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIHdvbWVuLiANCg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI1LiBFZHVjYXRvcnMgdHJhaW5lZCBpbiByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi42IENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI2IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNiwgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjYiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjYiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3I2KSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI2LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCByZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscyANCg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI2LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIDMuIFBhcnRuZXJzDQoNCiMjIDMuMSBPcGVyYXRpb25hbCBwcmVzZW5jZSBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMNCg0KPGJyPg0KDQoNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD03fQ0KDQpwYXJ0bmVyX21hcCA8LSBlaWUgJT4lIA0KICBtdXRhdGVfYXQodmFycyhib3lzLCBnaXJscywgbWVuLCB3b21lbiksIH4gcmVwbGFjZV9uYSguLCAwKSkgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlLCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgbGVhZF9vcmdhbmlzYXRpb24gPSBuX2Rpc3RpbmN0KGxlYWRfb3JnYW5pc2F0aW9uKSwNCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCksIA0KICAgICAgICAgICAgd29tZW4gPSBzdW0od29tZW5bYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG1lbiA9IHN1bShtZW5bYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBib3lzID0gc3VtKGJveXNbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBnaXJscyA9IHN1bShnaXJsc1thY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWRbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHJlYWNoZWQgPSBtZW4gKyB3b21lbiArIGJveXMgKyBnaXJscywgDQogICAgICAgICBtYWxlID0gbWVuICsgYm95cywgDQogICAgICAgICBmZW1hbGUgPSB3b21lbiArIGdpcmxzLCANCiAgICAgICAgIG1hbGVfcGMgPSByb3VuZChtYWxlIC8gcmVhY2hlZCAqIDEwMCksIA0KICAgICAgICAgZmVtYWxlX3BjID0gcm91bmQoZmVtYWxlIC8gcmVhY2hlZCAqIDEwMCkpICU+JSAgDQogIGxlZnRfam9pbihwYXJ0bmVyX2xpc3RfY291bnRpZXMgJT4lDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbTFfcGNvZGUsIGFjcm9ueW0pICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgYXJyYW5nZShhY3JvbnltKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShhY3JvbnltID0gcGFzdGUwKGFjcm9ueW0sIGNvbGxhcHNlID0gIiwgIikpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoYWNyb255bSA9IHN0cl9yZXBsYWNlX2FsbChhY3JvbnltLCAiQ2hpbGRGdW5kIiwgIkNGIiksIA0KICAgICAgICAgICAgICAgICAgICAgbl9wYXJ0bmVycyA9IHN0cl9jb3VudChhY3JvbnltLCAiLCIpICsgMSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGRhdGEgPSBwY29kZTFfc2hhcGUpICsgDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcGFydG5lcnMsIA0KICAgICAgICAgICAgICBjb2xvdXIgPSBhZG0xX3Bjb2RlKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMCggDQogICAgY291bnR5LCAiXG4iLCBwYXJ0bmVycyksIA0KICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoDQogICAgICAgICAgICAgICAgIkNvdW50eTogIiwgY291bnR5LCAiXG4iLCANCiAgICAgICAgICAgICAgICAiUGFydG5lcnM6ICIsIG5fcGFydG5lcnMsICJcbiIsIA0KICAgICAgICAgICAgICAgICJSZWFjaGVkOiAiLCBjb21tYShzZWN0b3JfcmVhY2hlZCksICJcbiIsIA0KICAgICAgICAgICAgICAgICJGZW1hbGVfcmVhY2hlZCU6ICIsIGZlbWFsZV9wYywgIiUiLCAiXG4iLCANCiAgICAgICAgICAgICAgICAiTWFsZV9yZWFjaGVkJTogIiwgbWFsZV9wYywgIiUiLCANCiAgICAgICAgICAgICAgICAiXG4iLCAiXG4iLCANCiAgICAgICAgICAgICAgICBhY3JvbnltKSksIA0KICAgICAgICAgICAgICAgIHNpemUgPSAzLCBjb2xvdXIgPSAiZ3JheTQwIikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxLCAzLCA2LCAxMCkpICsgDQogIA0KICB0aGVtZV92b2lkKCkgKyANCiAgIyBSZW1lbWJlciB0aGF0IHlvdSBuZWVkIGd1aWRlX2NvbG9yYmFyLCBub3QgZ3VpZGVfbGVnZW5kDQogICMgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihyZXZlcnNlID0gVFJVRSkpICsgDQogIGxhYnModGl0bGUgPSAiS0VOWUE6IEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIG9wZXJhdGlvbmFsIHByZXNlbmNlIiwgDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoImFzIG9mICIsIHJlcG9ydF9kYXRlKSwgDQogICAgICAgZmlsbCA9ICJQYXJ0bmVycyIpDQoNCg0KZ2dwbG90bHkocGFydG5lcl9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKHN1bV9zdGF0cyRwYXJ0bmVycywgIiBFaUUgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGFjcm9zcyAiLCBzdW1fc3RhdHMkY291bnRpZXMsICIgY291bnRpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBvZiAiLCByZXBvcnRfZGF0ZSwgIjsgbW91c2Ugb3ZlciBjb3VudHkgbmFtZSBmb3IgbW9yZSBkZXRhaWxzIiwgIjwvc3VwPiIpKSkNCmBgYA0KDQoNCjxicj4NCg0KQmVsb3cgaXMgYW4gaW50ZXJhY3RpdmUgdGFibGUgd2hpY2ggYWRkcyBkZXRhaWwgdG8gdGhlIG1hcCBhYm92ZSwgc2VydmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBjb29yZGluYXRpb24gLS0gYWxsb3dpbmcgaW50ZXJlc3RlZCBwYXJ0aWVzIHRvIHNlYXJjaCBieSBjb3VudHkgb3IgcGFydG5lci4gDQoNCiBUaGUgY29sdW1uIGAjQWN0aXZpdGllc2AgcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgRWR1Y2F0aW9uIGFjdGl2aXRpZXMgaW1wbGVtZW50ZWQgYnkgc2FpZCBwYXJ0bmVyIGluIGVhY2ggY291bnR5LiBFYWNoIGNvbHVtbiBjYW4gYmUgc29ydGVkIHdpdGggdGhlIGFycm93cyBuZXh0IHRvIGVhY2ggY29sdW1uIG5hbWUuIEVhY2ggY29sdW1uIGNhbiBhbHNvIGJlIGZpbHRlcmVkIGJ5IHR5cGluZyBpbnRvIHRoZSBzZWFyY2ggYmFyIGJlbG93IGVhY2ggY29sdW1uIG5hbWUuIE9ubHkgY29tcGxldGVkIGFjdGl2aXRpZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLg0KIA0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbiksIH4gDQogICAgICAgICAgICAgIHN0cl9zdWIoLiwgZW5kID0gNTBMKSkgJT4lICANCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgc2VsZWN0KGNvdW50eSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uLCByZWFjaGVkLCBgI2FjdGl2aXRpZXNgID0gYWN0aXZpdGllcywgYWRtMV9wY29kZSkgJT4lIA0KICB3cml0ZV9jc3YoIi4vZGF0YS9icmVha2Rvd25fYnlfY291bnR5X3BhcnRuZXIuY3N2IikNCmBgYA0KIA0KDQpEb3dubG9hZCB0aGUgZGF0YXNldCBmcm9tIHRoZSB0YWJsZSBiZWxvdyBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2JyZWFrZG93bl9ieV9jb3VudHlfcGFydG5lci5jc3YpLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSwgfiANCiAgICAgICAgICAgICAgc3RyX3N1YiguLCBlbmQgPSA1MEwpKSAlPiUgIA0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgbGVmdF9qb2luKHBhcnRuZXJfbGlzdF9jb3VudGllcyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KHBhcnRuZXIsIGFjcm9ueW0pLCANCiAgICAgICAgICAgIGJ5ID0gYygiaW1wbGVtZW50aW5nX3BhcnRuZXIiID0gInBhcnRuZXIiKSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBsZWFkX29yZ2FuaXNhdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGFjcm9ueW0sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHNlbGVjdF9hbGwoLiwgfiBzdHJfdG9fdGl0bGUoLikpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha2Rvd24gYnkgY291bnR5IGFuZCBwYXJ0bmVyIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJSZWFjaGVkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JSANCiAgZm9ybWF0Um91bmQoYygiUmVhY2hlZCIpLCBkaWdpdHMgPSAwKQ0KDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMy4yIFN1bW1hcnkgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXINCg0KDQpUaGUgdGFibGUgYmVsb3cgYnJlYWtzIGRvd24gcGVyc29ucyByZWFjaGVkIGJ5IHBhcnRuZXIuIA0KDQo8YnI+DQoNCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IHN0cl9zdWIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGVuZCA9IDUwTCkpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoYWRtMV9wY29kZSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBmaWx0ZXIocmVhY2hlZCA+IDApICU+JSANCiAgbXV0YXRlKGAldG90YWxgID0gcm91bmQocmVhY2hlZCAvIHN1bShyZWFjaGVkKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlYWNoZWQpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJTdW1tYXJ5IGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjkpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSAyLCByZWZfc3ltYm9scyA9ICIxIiwgcGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIkFsbCBpbmRpY2F0b3JzIGFzIG9wcG9zZWQgb25seSBpbmRpY2F0b3JzIDEsIDIsIDUgYW5kIDYiKSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDUsIHJlZl9zeW1ib2xzID0gIjIiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiUGVyY2VudGFnZSBvZiByZWFjaGVkIGZvciBhbGwgaW5kaWNhdG9ycyIpKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQoNCiMgNC4gU2Nob29scyBhbmQgZWR1Y2F0aW9uIGxldmVsDQoNCiMjIDQuMSBTY2hvb2xzDQoNClRoZSBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IHNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyBpbnRlcnZlbnRpb25zIHRvLWRhdGUgYXJlOiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY2hvb2xzKSkgJT4lDQogIG11dGF0ZShkYXRlID0gbmFtZV90b19kYXRlKG1vbnRoKSkgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDQiKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKHNjaG9vbHMgPSBzdW0oc2Nob29scyksIA0KICAgICAgICAgICAgcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkKSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9zY2hvb2xzID0gY3Vtc3VtKHNjaG9vbHMpKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fc2Nob29scyksIA0KICAgICAgICAgdmp1c3QgPSAtLjUpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuNywgDQogICAgICAgICAgICBhZXMoY29sb3VyID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGN1bV9zY2hvb2xzKSksIHZqdXN0ID0gLS41KSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzMxNjg4ZSIsICIjZDg1NzZiIikpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIlNjaG9vbHMgcmVhY2hlZCBieSBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyIsIA0KICAgICAgIGNvbG91ciA9ICJJbmRpY2F0b3IiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkhvd2V2ZXIsIHJlcG9ydGluZyB0aGUgb3ZlcmFsbCBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IGFsbCBFaUUgaW50ZXJ2ZW50aW9ucyBpcyBtdWNoIG1vcmUgY2hhbGxlbmdpbmcuDQoNCldoaWxzdCBhbGwgcGFydG5lcnMgd29ya2luZyBvbiBpbmRpY2F0b3JzIDIgYW5kIDQgc3VibWl0dGVkIHRoZSBudW1iZXIgb2Ygc2Nob29scyB0aGV5IHdlcmUgd29ya2luZyBpbiwgdGhlIHNhbWUgaXMgbm90IHRydWUgZm9yIHRoZSBvdGhlciBpbmRpY2F0b3JzLiBPbmx5IGluZGljYXRvcnMgMiBhbmQgNCByZXF1aXJlIHRoZSByZXBvcnRpbmcgb2YgdGhlIG51bWJlciBvZiBzY2hvb2xzLiANCg0KDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDQuMiBFZHVjYXRpb24gbGV2ZWwgDQoNClRoZSBkYXRhIGNvbGxlY3RlZCBvbiBlZHVjYXRpb24gbGV2ZWwgaXMgbXVkZGxlZDogdGhlIGNvbWJpbmF0aW9uIG9mIHZhcmlvdXMgY2F0ZWdvcmllcyAoc3VjaCBhcyBgRUNFICYgUHJpbWFyeWAgYW5kIGBBbGwgQmFzaWMgRWR1Y2F0aW9uYCkgaGFtcGVycyBhIGNsZWFuIGJyZWFrZG93biBieSBlZHVjYXRpb24gbGV2ZWw6IA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoZ2lybHMsIGJveXMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShlZHVjYXRpb25fbGV2ZWwpKSAlPiUgDQogIG11dGF0ZShjaGlsZHJlbiA9IGJveXMgKyBnaXJscykgJT4lIA0KICBncm91cF9ieShlZHVjYXRpb25fbGV2ZWwpICU+JSANCiAgc3VtbWFyaXNlKGNoaWxkcmVuID0gc3VtKGNoaWxkcmVuKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoY2hpbGRyZW4pKSAlPiUgDQogIG11dGF0ZShgJV9vZl90b3RhbGAgPSByb3VuZChjaGlsZHJlbiAvIHN1bShjaGlsZHJlbikgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJDaGlsZHJlbiByZWFjaGVkIGJ5IGVkdWNhdGlvbiBsZXZlbCIpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KYGBgDQoNCjxicj4NCg0KRm9yIGluc3RhbmNlLCBpdCBpcyBub3QgcG9zc2libGUgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gc2VydmVkIGZyb20gcHJpbWFyeS1sZXZlbCBpbnN0aXR1dGlvbnMuIA0KDQpUbyB1bmRlcnN0YW5kIHJlcG9ydGluZyBhcm91bmQgdGhlIG1pc21hdGNoIG9mIGVkdWNhdGlvbi1sZXZlbCBjYXRlZ29yaWVzLCBsZXQgdXMgZXhhbWluZSBpbmRpdmlkdWFsIGluZGljYXRvcnMuIEluIHRoZSBwbG90IGJlbG93LCBjaGlsZHJlbiByZWFjaGVkIGhhdmUgYmVlbiBicm9rZW4gZG93biBieSBlZHVjYXRpb24gbGV2ZWwgYW5kIGJ5IGluZGljYXRvci4gVGhlIGNhdGVnb3J5IGBBbGwgQmFzaWMgRWR1Y2F0aW9uYCwgd2hpbHN0IHByZXNlbnQgaW4gYWxsIG9mIHRoZSBpbmRpY2F0b3JzLCBpcyBtb3N0IGhlYXZpbHkgdXNlZCBpbiB0aGUgV0FTSC1pbi1zY2hvb2xzIGludGVydmVudGlvbi4gQWRkaXRpb25hbGx5LCB0aGlzIGluZGljYXRvciBpcyB1c2VkIGJ5IDUgZGlmZmVyZW50IGltcGxlbWVudGluZyBwYXJ0bmVycy4gDQoNCjxicj4NCg0KYGBge3J9DQoNCg0KZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoZ2lybHMsIGJveXMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShlZHVjYXRpb25fbGV2ZWwpKSAlPiUgDQogIG11dGF0ZShyZWFjaGVkID0gYm95cyArIGdpcmxzICsgbWVuICsgd29tZW4pICU+JSANCiAgZ3JvdXBfYnkoZWR1Y2F0aW9uX2xldmVsLCBpbmRpY2F0b3Jfc2hvcnQpICU+JQ0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShyZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShyZWFjaGVkKSkgJT4lICANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHBjID0gcmVhY2hlZCAvIHRvdGFsLCANCiAgICAgICAgIGluZGljYXRvcl9zaG9ydCA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGluZGljYXRvcl9zaG9ydCwgZmlsbCA9IGVkdWNhdGlvbl9sZXZlbCkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyh4ID0gcGMsIA0KICAgICAgICAgICAgICAgIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIA0KICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAxKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpLCANCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbi1sZXZlbCBicmVha2Rvd24gYnkgaW5kaWNhdG9yIiwgDQogICAgICAgZmlsbCA9ICIiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCg0KDQoNCg0KDQojIDUuIFJlZmVyZW5jZSBtYXBzIGFuZCB0YWJsZXMgDQoNCiMjIDUuMSBSZWZlcmVuY2UgbWFwcyANCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjIxMC8/aXNvMz1LRU4pLiANCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEwfQ0KaXBjICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG51bWJlcl9waGFzZV9wMykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShudW1iZXJfcGhhc2VfcDMpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIkF0IGxlYXN0XG5waGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIHBlcnNvbnMgSVBDIFBoYXNlIDMgb3IgYWJvdmUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnLyIpICsgDQoNCmlwYyAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGVyY2VudF9waGFzZV9wMykpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQyBwaGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBwb3B1bGF0aW9uIElQQyBQaGFzZSAzIG9yIGFib3ZlIiwgDQogICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBodHRwczovL3d3dy5pcGNpbmZvLm9yZy8iKSArDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBzZWN0b3JfcmVhY2hlZCkpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShzZWN0b3JfcmVhY2hlZCkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yLA0KICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMzM5NDgzKSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJTZWN0b3JcbnJlYWNoZWQiLCANCiAgICAgICB0aXRsZSA9ICJQZXJzb25zIHJlYWNoZWQgYnkgdGhlIEVkdWNhdGlvbiBTZWN0b3IiKSArIA0KICANCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbTFfcGNvZGUsIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHJlYWNoZWQgPSAwLCB0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUocGMgPSBpZmVsc2UodGFyZ2V0ID09IDAsIDAsIHJlYWNoZWQgLyB0YXJnZXQpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBjKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIiUgb2YgdGFyZ2V0IiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBFaUUgY291bnR5IHRhcmdldCByZWFjaGVkIikgKyAgIA0KDQpwbG90X2xheW91dChuY29sID0gMiwgDQogICAgICAgICAgICBucm93ID0gMikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgNS4yIFJlZmVyZW5jZSB0YWJsZSANCg0KRG93bmxvYWQgdGhlIEVpRSA1V3MgZGF0YSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2VpZV81d3MuY3N2KQ0KDQpBcyBhIHJlZnJlc2hlciBmb3IgdGhlIHJlZmVyZW5jZSB0YWJsZSBiZWxvdywgdGhlIGluZGljYXRvcnMgYXJlOiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGRpc3RpbmN0KGluZGljYXRvcikgJT4lIA0KICBhcnJhbmdlKGluZGljYXRvcikgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyh3aWR0aCA9IC44NSwgbGF5b3V0ID0gImF1dG9maXQiKSAlPiUgDQogIGZvbnRzaXplKGkgPSAxOjYsIGogPSAxLCBzaXplID0gOSkgDQoNCmBgYA0KDQo8YnI+DQoNCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IHN0cl9zdWIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGVuZCA9IDUwTCksIA0KICAgICAgICAgaW5kaWNhdG9yX251bWJlciA9IHBhcnNlX251bWJlcihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgaW5kaWNhdG9yX251bWJlcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3IgPSBpbmRpY2F0b3JfbnVtYmVyLCByZWFjaGVkLCBhZG0xX3Bjb2RlKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtkb3duIGJ5IGluZGljYXRvciwgY291bnR5IGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lciIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygicmVhY2hlZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInJlYWNoZWQiKSwgZGlnaXRzID0gMCkNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNS4zIFJlcG9ydGluZyBxdWFsaXR5IA0KDQojIyMgNS4zLjEgU3ViLWNvdW50aWVzIA0KDQpgYGB7cn0NCnJlYWRfY3N2KCIuL2RhdGEvZWllXzV3c18yMDIzMDcyNC5jc3YiKSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShzdWJfY291bnR5KSkgJT4lDQogIHNsaWNlKDE1OjIwKSAlPiUgDQogIHNlbGVjdChjb3VudHksIHN1Yl9jb3VudHksIHRvdGFsX3JlYWNoZWQpICU+JSANCiAgc2VsZWN0X2FsbCh+IHN0cl90b190aXRsZSguKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiRm9yIHNldmVyYWwgZW50cmllcywgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzdWItY291bnR5IHBlciByb3ciKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNykNCg0KYGBgDQoNCjxicj4NCg0KV2l0aCByZWZlcmVuY2UgdG8gdGhlIGV4dHJhY3QgZnJvbSB0aGUgNVdzIGFib3ZlLCBhbmFseXNpcyBhbmQgcmVwb3J0aW5nIGlzIGF0IHRoZSBzdWItY291bnR5IGxldmVsIGZvciB0aGUgODYlIG9mIGJlbmVmaWNpYXJpZXMgd2hvIHdlcmUgcmVwb3J0ZWQgd2l0aG91dCB0aGlzIHR5cGUgb2YgZXJyb3IuIEhvd2V2ZXIsIHVudGlsIHRoaXMgaXNzdWUgaXMgcmVzb2x2ZWQsIG1ha2luZyBhbnkgc3ViLWNvdW50eS1sZXZlbCBtYXBzIG9yIHByb2R1Y3RzIHdpbGwgbmVjZXNzYXJpbHkgZXhjbHVkZSBhIHNpemVhYmxlIHBvcnRpb24gb2YgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gDQoNCg0KPGJyPiANCg0KDQoNCmBgYHtyfQ0KcmVhZF9jc3YoIi4vZGF0YS9laWVfNXdzXzIwMjMwNzI0LmNzdiIpICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUob25lX3N1Yl9jb3VudHkgPSBpZmVsc2Uoc3RyX2RldGVjdChzdWJfY291bnR5LCAiLCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgVFJVRSkpICU+JQ0KICBncm91cF9ieShvbmVfc3ViX2NvdW50eSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShgJV90b3RhbGAgPSByb3VuZCh0b3RhbF9yZWFjaGVkIC8gc3VtKHRvdGFsX3JlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBvbmVfc3ViX2NvdW50eSA9IGlmZWxzZShpcy5uYShvbmVfc3ViX2NvdW50eSksICJOQSIsIG9uZV9zdWJfY291bnR5KSwgDQogICAgICAgICBvbmVfc3ViX2NvdW50eSA9IGZjdF9yZWxldmVsKG9uZV9zdWJfY291bnR5LCBjKCJUUlVFIiwgIkZBTFNFIiwgIk5BIikpKSAlPiUNCiAgYXJyYW5nZShvbmVfc3ViX2NvdW50eSkgJT4lIA0KICBzZWxlY3RfYWxsKH4gc3RyX3RvX3RpdGxlKC4pKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKCI4NiUgb2YgYmVuZWZpY2lhcmllcyByZXBvcnRlZCB3aXRoIG9uZSBzdWItY291bnR5IHBlciByb3ciKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNykNCmBgYA0KDQo8YnI+DQoNCkluIHRoZSBwcm9wb3NlZCByZXZpc2lvbiB0byB0aGUgNVcgdGVtcGxhdGUsIHRoZSBzdWItY291bnR5IGNvbHVtbiBoYXMgYmVlbiByZXZpc2VkIHRvIGJlIGEgZHJvcGRvd24gbGlzdCBkZXBlbmRlbnQgb24gdGhlIGlucHV0IGluIHRoZSBgY291bnR5YCBjb2x1bW4uIEdvaW5nIGZvcndhcmQsIG9ubHkgb25lIHN1Yi1jb3VudHkgc2hvdWxkIGJlIHJlcG9ydGVkIHBlciByb3cuIA0KDQo8YnI+PGJyPg0KDQojIyMgNS4zLjIgU2Nob29scw0KDQpUaGUgbmV4dCBzdGVwIGlzIHRvIG1vdmUgZnJvbSBlbnRlcmluZyB0aGUgbmFtZXMgb2Ygc2Nob29scyB0byBqdXN0IGVudGVyaW5nIHRoZSBudW1iZXIgb2Ygc2Nob29scyBwZXIgaW50ZXJ2ZW50aW9uLiBUaGUgYHNjaG9vbHNfdGV4dGAgY29sdW1uIGJlbG93IGlzIGRhdGEgZW50ZXJlZCBpbnRvIDVXcyB0ZW1wbGF0ZS4gVGhlIGNvbHVtbiBpcyBjdXJyZW50bHkgYSBtaXggb2YgbmFtZXMgb2Ygc2Nob29scyBhbmQgbnVtYmVyIG9mIHNjaG9vbHMuIEl0IGlzIGJlc3QgdG8gY29sbGVjdCBvbmx5IHRoZSBudW1iZXIgb2Ygc2Nob29scyBhbmQgaGF2ZSB0aGUgbmFtZXMgYmUgaW5jbHVkZWQgaW4gdGhlIGNvbW1lbnRzLiANCg0KPGJyPiANCg0KYGBge3J9DQoNCnJlYWRfY3N2KCIuL2RhdGEvZWllXzV3c18yMDIzMDcyNC5jc3YiKSAlPiUgDQogIGZpbHRlcighaXMubmEobmFtZXNfbnVtYmVyc19zY2hvb2xzKSkgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIHNsaWNlKDExLCAxMiwgMTMpICU+JSANCiAgc2VsZWN0KFNjaG9vbHNfdGV4dCA9IG5hbWVzX251bWJlcnNfc2Nob29scywgU2Nob29sc19udW1iZXIgPSBzY2hvb2xzKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNykgJT4lIA0KICBzZXRfY2FwdGlvbigiU2Nob29scyBjb2x1bW4gaXMgYSBtaXggb2YgdGV4dCBhbmQgbnVtYmVycyIpDQogIA0KDQpgYGANCg0KDQo8YnI+IA0KDQpJdCBpcyBzdGlsbCB2YWx1YWJsZSB0byBjb2xsZWN0IHNjaG9vbCBuYW1lcyBhbmQgbWF0Y2ggdGhlbSB0byB0aGUgbGlzdCBvZiBzY2hvb2wgY29kZXMgYW5kIGdlb2Nvb3JkaW5hdGVzLCBlc3BlY2lhbGx5IGZvciBzaXRlLWxldmVsIG1vbml0b3JpbmcsIGJ1dCB0aGF0IGlzIGEgc3RlcCB0byBiZSB0YWtlbiBvbmNlIHRoZSBmb3JtYXQgb2Ygc2Nob29sIG5hbWVzIGJlaW5nIGNvbGxlY3RlZCBoYXMgYmVlbiBzdGFuZGFyZGlzZWQuIA0KDQo8YnI+PGJyPg0KDQojIyMgNS4zLjMgRWR1Y2F0aW9uIGxldmVsDQoNCkFzIHJlcG9ydGVkIGluIGFuIGVhcmxpZXIgc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnQsIGl0IGlzIGN1cnJlbnRseSBub3QgcG9zc2libGUgdG8gaGF2ZSBhIGNsZWFuIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgZWR1Y2F0aW9uIGxldmVsOiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGdpcmxzLCBib3lzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIGZpbHRlcighaXMubmEoZWR1Y2F0aW9uX2xldmVsKSkgJT4lIA0KICBtdXRhdGUoY2hpbGRyZW4gPSBib3lzICsgZ2lybHMpICU+JSANCiAgZ3JvdXBfYnkoZWR1Y2F0aW9uX2xldmVsKSAlPiUgDQogIHN1bW1hcmlzZShjaGlsZHJlbiA9IHN1bShjaGlsZHJlbikpICU+JSANCiAgYXJyYW5nZShkZXNjKGNoaWxkcmVuKSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfdG90YWxgID0gcm91bmQoY2hpbGRyZW4gLyBzdW0oY2hpbGRyZW4pICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiQ2hpbGRyZW4gcmVhY2hlZCBieSBlZHVjYXRpb24gbGV2ZWwiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNikNCmBgYA0KDQoNCjxicj4NCg0KSW4gdGhlIHVwZGF0ZWQgdGVtcGxhdGUsIHRoZSBvcHRpb25zICBgQWxsIEJhc2ljIEVkdWNhdGlvbmAgYW5kIGBQcmltYXJ5L0VDRWAgaGF2ZSBiZWVuIHJlbW92ZWQgYW5kIHBhcnRuZXJzIGFyZSByZXF1ZXN0ZWQgdG8gb25seSBzZWxlY3Qgb25lIGVkdWNhdGlvbiBsZXZlbCBwZXIgcm93LiANCg0KDQoNCg0KDQoNCg0KDQoNCg==